Название плагина: DKR_PictureOnSkillObserve
Автор: DarchanKaen (основной плагин), Yoji Ojima (честно сворована техника отображения текста картинкой)
Версия: 2.0
Дата выхода:
Версия 2.0 - 27.05.2021.
Версия 1.0 - 24.05.2021
Описание плагина:
Плагин позволяет отображать Картинку / Описание при выборе скила в бою, для каждого скила - свою.
Использование плагина:
Одинаково и для MV , и для MZ (в эвенте, в команде "Скрипт")!
В Примечании к Скилу напишите:
<ImageOnChooseSkill>
Название файла картинки БЕЗ РАСШИРЕНИЯ И КАВЫЧЕК! (например: Actor1 )
</ImageOnChooseSkill>
И / ИЛИ
<DescrOnChooseSkill>
Текст описания. Допустимы коды сообщений, например: цвета типа \C[n]
</DescrOnChooseSkill>
- Включение и отключение показа Картинки:
DKR.PictureOnSkillObserve.enablePicture(); - показывать Картинку / Описание.
DKR.PictureOnSkillObserve.dissablePicture(); - не показывать Картинку / Описание.
DKR.PictureOnSkillObserve.setObserverPictureMode(' MODE'); - задать режим отображения Картинки / Описания, где 'MODE' - режим, варианты:
'IMAGE' (Картинка, указанная между тегов ImageOnChooseSkill в Примечании скила),
'DATA' (Полное описание - генерируется автоматически),
'SIMPLE' (Упрощенное описание - генерируется автоматически),
'DESCR' (Текст между тегов DescrOnChooseSkill, указанный в Примечании скила).
По-умолчанию работает режим 'DATA' !
- Настройки отображения Картинки:
DKR.PictureOnSkillObserve.setPictureNumber(); - задать номер Картинки; по-умолчанию: 1.
DKR.PictureOnSkillObserve.setPictureOrigin(); - задать начало координат Картинки; по-умолчанию: 0.
DKR.PictureOnSkillObserve.setPictureCoordX(); - задать координату X Картинки; по-умолчанию: 20.
DKR.PictureOnSkillObserve.setPictureCoordY(); - задать координату Y Картинки; по-умолчанию: 300.
DKR.PictureOnSkillObserve.setPictureScaleX(); - задать масштаб X Картинки; по-умолчанию: 100.
DKR.PictureOnSkillObserve.setPictureScaleY(); - задать масштаб Y Картинки; по-умолчанию: 100.
DKR.PictureOnSkillObserve.setPictureOpacity(); - задать прозрачность Картинки; по-умолчанию: 255.
DKR.PictureOnSkillObserve.setPictureBlendMode (); - задать режим смешивания Картинки; по-умолчанию: 0.
Спойлер Код плагина:
Спойлер MV, версия 2.0:
Код:/*: *----------------------------------------------------------------------------- * DKR PictureOnSkillObserve *----------------------------------------------------------------------------- * For: RPGMAKER MV * DKR_PictureOnSkillObserve_2_MV.js *----------------------------------------------------------------------------- * 26.05.2021 - Версия 2.0.0 *----------------------------------------------------------------------------- * Поставляется AS-IS. * Вся ответственность при использовании - на Пользователе! *----------------------------------------------------------------------------- *----------------------------------------------------------------------------- * @author DarchanKaen * @target MV * @plugindesc (v.2.0.0) Плагин позволяет отображать Картинку / Описание при выборе скила в бою, для каждого скила - свою. * @help * DKR PictureOnSkillObserve 2.0 MV * ---------------------------------------------------------------------------- * ---Общая информация: * Плагин позволяет отображать Картинку или Описание * (автоматическое или ручное) при выборе скила в бою, * для каждого скила - свою Картинку / Описание. * Картина / Описание отображается в фоне Окна умений. * Для режима Картинок, они должны быть в папке "\img\pictures". * Для режимов Описания, в папке "\img\pictures" должен быть (!!!) * файл "onSkillObserveBackground.png" - это фон описания * (размер изображения 816x624). * ---Использование: * В Примечании к Скилу напишите: *<ImageOnChooseSkill> * Название файла картинки БЕЗ РАСШИРЕНИЯ И КАВЫЧЕК! (например: Actor1 ) *</ImageOnChooseSkill> * И / ИЛИ * <DescrOnChooseSkill> * Текст описания. Допустимы коды сообщений, например цвета типа \C[n]... * </DescrOnChooseSkill> * Если у скила в Примечании нет данных тегов, то ничего доп-го не отображается. * ---Команды (для раздела "Скрипт"): * - Включение и отключение показа Картинки / Описания: * DKR.PictureOnSkillObserve.enablePicture(); - показывать Картинку / Описание. * DKR.PictureOnSkillObserve.dissablePicture(); - не показывать Картинку / Описание. * DKR.PictureOnSkillObserve.dissablePicture(); - не показывать Картинку / Описание. * DKR.PictureOnSkillObserve.setObserverPictureMode('MODE'); - задать режим отображения Картинки / Описания. * где 'MODE' - режим, варианты: * 'IMAGE' (Картинка), * 'DATA' (Полное описание), * 'SIMPLE' (Упрощеное описание), * 'DESCR' (Текст между тегов DescrOnChooseSkill). * режим указывается в ковычках, режим может быть выбрано ТОЛЬКО один; по-умолчанию: 'DATA'. - Настройки отображения Картинки (не влияет на режимы Описания!): * DKR.PictureOnSkillObserve.setPictureNumber(N); - задать номер Картинки; по-умолчанию: 90. Номер должен меньше 95! * DKR.PictureOnSkillObserve.setPictureOrigin(N); - задать начало координат Картинки; по-умолчанию: 0. * DKR.PictureOnSkillObserve.setPictureCoordX(N); - задать координату X Картинки; по-умолчанию: 20. * DKR.PictureOnSkillObserve.setPictureCoordY(N); - задать координату Y Картинки; по-умолчанию: 300. * DKR.PictureOnSkillObserve.setPictureScaleX(N); - задать масштаб X Картинки; по-умолчанию: 100. * DKR.PictureOnSkillObserve.setPictureScaleY(N); - задать масштаб Y Картинки; по-умолчанию: 100. * DKR.PictureOnSkillObserve.setPictureOpacity(N); - задать прозрачность Картинки; по-умолчанию: 255. * DKR.PictureOnSkillObserve.setPictureBlendMode(N); - задать режим смешивания Картинки; по-умолчанию: 0. * где N - значание в виде целого не отрицательного числа. * ---------------------------------------------------------------------------- */ var Imported = Imported || {}; Imported.DKR_PictureOnSkillObserve = true; var DKR = DKR || {}; DKR.PictureOnSkillObserve = DKR.PictureOnSkillObserve || {}; DKR.PictureOnSkillObserve.version = 2.0; ( () => { let picIsShow = true; let textIsShow = true; let picNumber = 1; let picOrigin = 0; let picCoordX = 20; let picCoordY = 300; let picScaleX = 100; let picScaleY = 100; let picOpacity = 255; let picBlendMode = 0; let observerPictureMode = 'DATA'; const skillDescrBackgroundImageSRC = 'onSkillObserveBackground'; const skillDescrBackgroundOrigin = 0; const skillDescrBackgroundCoordX = 0; const skillDescrBackgroundCoordY = 0; const skillDescrBackgroundScaleX = 100; const skillDescrBackgroundScaleY = 100; const skillDescrBackgroundOpacity = 255; const skillDescrBackgroundBlendMode = 0; let textPictureText = ''; const skillDescrTextOrigin = 0; const skillDescrTextCoordX = 25; const skillDescrTextCoordY = 175; const skillDescrTextScaleX = 100; const skillDescrTextScaleY = 100; const skillDescrTextOpacity = 255; const skillDescrTextBlendMode = 0; const normalColorTag = '\\C[0]'; const nameColorTag = '\\C[4]'; const mpCostColorTag = '\\C[1]'; const tpCostColorTag = '\\C[3]'; const tpGenColorTag = '\\C[11]'; const formulaColorTag = '\\C[8]'; const elementColorTag = '\\C[7]'; const simpleDescrColorTag = '\\C[6]'; const isCanCritColorTag = '\\C[10]'; const varianceColorTag = '\\C[14]'; const repeatsColorTag = '\\C[20]'; const statesColorTag = '\\C[27]'; const targetColorTag = '\\C[18]'; const damageTypeColorTag = '\\C[5]'; DKR.PictureOnSkillObserve.Window_SkillList__UpdateHelp = Window_SkillList.prototype.updateHelp; Window_SkillList.prototype.updateHelp = function(){ DKR.PictureOnSkillObserve.Window_SkillList__UpdateHelp.call(this); if(undefined === this.item()){ console.log('DKR.PictureOnSkillObserve: skill undefined...'); return; } getSkillTextBySkilLData( getSkillDataToDraw(this.item()) ); if(true === picIsShow){ try{ if('IMAGE' === observerPictureMode){ let imageSRC = parseNotesForImageSRC(this.item()); $gameScreen.showPicture(picNumber, imageSRC, picOrigin, picCoordX, picCoordY, picScaleX, picScaleY, picOpacity, picBlendMode); }else{ textIsShow = true; $gameScreen.showPicture(picNumber, skillDescrBackgroundImageSRC, skillDescrBackgroundOrigin, skillDescrBackgroundCoordX, skillDescrBackgroundCoordY, skillDescrBackgroundScaleX, skillDescrBackgroundScaleY, skillDescrBackgroundOpacity, skillDescrBackgroundBlendMode); if('DATA' === observerPictureMode){ textPictureText = getSkillTextBySkilLData( getSkillDataToDraw(this.item()), true ); }else if('SIMPLE' === observerPictureMode){ textPictureText = getSkillTextBySkilLData( getSkillDataToDraw(this.item()), false ); }else if('DESCR' === observerPictureMode){ textPictureText = parseNotesForDescription(this.item()); } $gameScreen.showPicture(picNumber + 1, "", picOrigin, skillDescrTextCoordX, skillDescrTextCoordY, skillDescrTextScaleX, skillDescrTextScaleY, skillDescrTextOpacity, skillDescrTextBlendMode); } }catch (e) { console.log('DKR.PictureOnSkillObserve: skill not exist or wrong notetag!'); return; } } } DKR.PictureOnSkillObserve.Scene_Battle__onSkillCancel = Scene_Battle.prototype.onSkillCancel; Scene_Battle.prototype.onSkillCancel = function() { DKR.PictureOnSkillObserve.Scene_Battle__onSkillCancel.call(this); if(true === picIsShow){ $gameScreen.erasePicture(picNumber); if(true === textIsShow){ $gameScreen.erasePicture(picNumber + 1); } } } DKR.PictureOnSkillObserve.Scene_Battle__onSkillOk = Scene_Battle.prototype.onSkillOk; Scene_Battle.prototype.onSkillOk = function() { DKR.PictureOnSkillObserve.Scene_Battle__onSkillOk.call(this); if(true === picIsShow){ $gameScreen.erasePicture(picNumber); if(true === textIsShow){ $gameScreen.erasePicture(picNumber + 1); } } }; let parseNotesForImageSRC = function(skill){ let notedata = skill.note.split(/[\r\n]+/); let imageSRC = ''; let tag = 'ImageOnChooseSkill'; for (let i = 0; i < notedata.length; i++) { let line = notedata[i]; if (notedata[i].match(tag)) { imageSRC = notedata[i + 1]; break; } } return imageSRC; } let parseNotesForDescription = function(skill){ let notedata = skill.note.split(/[\r\n]+/); let descrText = ''; let tag = 'DescrOnChooseSkill'; let matchCount = 0; for (let i = 0; i < notedata.length; i++) { let line = notedata[i]; if (notedata[i].match(tag)) { matchCount++; if(2 === matchCount){ break; }else{ descrText = '\\}\r\n'; continue; } } if(1 === matchCount){ descrText += notedata[i] + '\r\n'; } } descrText += '\\{'; return descrText; } let getSkillDataToDraw = function(skill){ let skillName = skill.name; let skillMpCost = skill.mpCost; let skillTpCost = skill.tpCost; let skillTpGain = skill.tpGain; let skillDescr = skill.description; let skillFormula = skill.damage.formula; let skillElement = 'Нет элемента'; if(0 === skill.damage.elementId){ skillElement = 'Обычная атака'; }else if(skill.damage.elementId >-1){ skillElement = $dataSystem.elements[skill.damage.elementId]; } let isSkillCanCrit = ''; if(true === skill.damage.critical){ isSkillCanCrit = 'Да'; }else{ isSkillCanCrit = 'Нет'; } let isSkillCanVariance = skill.damage.variance; let skillRepeats = skill.repeats; let skillAddStates = []; for(let n = 0; n < skill.effects.length; n++){ if(null === skill.effects[n]){ continue; } if(0 === skill.effects[n].dataId){ continue; } let statusId = skill.effects[n].dataId; skillAddStates[n] = [$dataStates[statusId].name, skill.effects[n].value1 * 100]; } if(0 === skillAddStates.length){ skillAddStates = [['Не накладывает статус!', 0]]; } let skillTarget = ''; switch(skill.scope){ case 0: skillTarget = 'Нет цели'; break; case 1: skillTarget = '1 Враг'; break; case 2: skillTarget = 'Все Враги'; break; case 3: skillTarget = '1 случайный Враг'; break; case 4: skillTarget = '2 случайных Врага'; break; case 5: skillTarget = '3 случайных Врага'; break; case 6: skillTarget = '4 случайных Врага'; break; case 7: skillTarget = '1 Союзник'; break; case 8: skillTarget = 'Все Союзники'; break; case 9: skillTarget = '1 мертвый Союзник'; break; case 10: skillTarget = 'Все мертвые Союзники'; break; case 11: skillTarget = 'Сам кастер'; break; default: skillTarget = '???'; break; } let skillDamageType = ''; switch(skill.damage.type){ case 0: skillDamageType = 'Нет типа'; break; case 1: skillDamageType = 'Урон ХП'; break; case 2: skillDamageType = 'Урон МП'; break; case 3: skillDamageType = 'Восст-е ХП'; break; case 4: skillDamageType = 'Восстн-е МП'; break; case 5: skillDamageType = 'Вамп-м ХП'; break; case 6: skillDamageType = 'Вамп-м МП'; break; } let skillDataToDisplay = [skillName, skillMpCost, skillTpCost, skillTpGain, skillDescr, skillFormula, skillElement, isSkillCanCrit, isSkillCanVariance, skillRepeats, skillAddStates, skillTarget, skillDamageType]; return skillDataToDisplay; } let getSkillTextBySkilLData = function(skillData, isFullText){ let skillText = ''; if(true === isFullText){ skillText = `\\} ${targetColorTag}Цель:${normalColorTag} ${skillData[11]} | ${damageTypeColorTag}Тип:${normalColorTag} ${skillData[12]} ${mpCostColorTag}Стоимость МП:${normalColorTag} ${skillData[1]} | ${tpCostColorTag}Стоимость ТП:${normalColorTag} ${skillData[2]} | ${tpGenColorTag}Генерация ТП:${normalColorTag} ${skillData[3]} ${formulaColorTag}Формула:${normalColorTag} ${skillData[5]} | ${elementColorTag}Элемент:${normalColorTag} ${skillData[6]} ${isCanCritColorTag}Может критовать:${normalColorTag} ${skillData[7]} | ${varianceColorTag}Разброс урона:${normalColorTag} ${skillData[8]}% | ${repeatsColorTag}Повторения:${normalColorTag} ${skillData[9]} ${statesColorTag}Накладывает состояния:${normalColorTag} `; for(let n = 0; n < skillData[10].length; n++){ let currentStatus = skillData[10][n]; if(undefined === currentStatus){ continue; } skillText += currentStatus[0] + '(' + currentStatus[1] + '%)'+ '\r\n'; } skillText += '\\{'; }else{ skillText = `\\} ${nameColorTag}Название:${normalColorTag} ${skillData[0]} | ${targetColorTag}Цель:${normalColorTag} ${skillData[11]} ${mpCostColorTag}Стоимость МП:${normalColorTag} ${skillData[1]} | ${tpCostColorTag}Стоимость ТП:${normalColorTag} ${skillData[2]} | ${tpGenColorTag}Генерация ТП:${normalColorTag} ${skillData[3]} ${simpleDescrColorTag}Описание:${normalColorTag} ${skillData[4]} \\{` } return skillText; } DKR.PictureOnSkillObserve.enablePicture = function(){ picIsShow = true; } DKR.PictureOnSkillObserve.dissablePicture = function(){ picIsShow = false; } DKR.PictureOnSkillObserve.setObserverPictureMode = function(MODE){ observerPictureMode = MODE; } DKR.PictureOnSkillObserve.setPictureNumber = function(pNumber){ if(pNumber < 0){ console.log('DKR.PictureOnSkillObserve: picture number can`t be below zero!'); return; }else if(pNumber > 95){ console.log('DKR.PictureOnSkillObserve: picture number can`t be more then 90!'); return; } picNumber = pNumber; } DKR.PictureOnSkillObserve.setPictureOrigin = function(pOrigin){ picOrigin = pOrigin; } DKR.PictureOnSkillObserve.setPictureCoordX = function(pCoordX){ if(pCoordX < 0){ console.log('DKR.PictureOnSkillObserve: picture coordinate X can`t be below zero!'); return; } picCoordX = pCoordX; } DKR.PictureOnSkillObserve.setPictureCoordY = function(pCoordY){ if(pCoordY < 0){ console.log('DKR.PictureOnSkillObserve: picture coordinate Y can`t be below zero!'); return; } picCoordY = pCoordY; } DKR.PictureOnSkillObserve.setPictureScaleX = function(pScaleX){ if(pScaleX < 0){ console.log('DKR.PictureOnSkillObserve: picture scale X can`t be below zero!'); return; } picScaleX = pScaleX; } DKR.PictureOnSkillObserve.setPictureScaleY = function(pScaleY){ if(pScaleY < 0){ console.log('DKR.PictureOnSkillObserve: picture scale Y can`t be below zero!'); return; } picScaleX = pScaleX; } DKR.PictureOnSkillObserve.setPictureOpacity = function(pOpacity){ picOpacity = pOpacity; } DKR.PictureOnSkillObserve.setPictureBlendMode = function(pBlendMode ){ picBlendMode = pBlendMode ; } //Thanks to Yoji Ojima const _Game_Picture_show = Game_Picture.prototype.show; Game_Picture.prototype.show = function() { _Game_Picture_show.apply(this, arguments); if (this._name === "" && textPictureText) { console.log('textPictureText:'); console.log(textPictureText); this.mzkp_text = textPictureText; this.mzkp_textChanged = true; textPictureText = ''; } }; const _Sprite_Picture_destroy = Sprite_Picture.prototype.destroy; Sprite_Picture.prototype.destroy = function() { destroyTextPictureBitmap(this.bitmap); _Sprite_Picture_destroy.apply(this, arguments); }; const _Sprite_Picture_updateBitmap = Sprite_Picture.prototype.updateBitmap; Sprite_Picture.prototype.updateBitmap = function() { _Sprite_Picture_updateBitmap.apply(this, arguments); if (this.visible && this._pictureName === "") { const picture = this.picture(); const text = picture ? picture.mzkp_text || "" : ""; const textChanged = picture && picture.mzkp_textChanged; if (this.mzkp_text !== text || textChanged) { this.mzkp_text = text; destroyTextPictureBitmap(this.bitmap); this.bitmap = createTextPictureBitmap(text); picture.mzkp_textChanged = false; } } else { this.mzkp_text = ""; } }; function createTextPictureBitmap(text) { const tempWindow = new Window_Base(new Rectangle()); const size = {width:750, height: 300}; //MV: hardcode //MZ: textSizeEx(text) tempWindow.padding = 0; tempWindow.move(0, 0, size.width, size.height); tempWindow.createContents(); tempWindow.drawTextEx(text, 0, 0, 0); const bitmap = tempWindow.contents; tempWindow.contents = null; tempWindow.destroy(); bitmap.mzkp_isTextPicture = true; return bitmap; } function destroyTextPictureBitmap(bitmap) { if (bitmap && bitmap.mzkp_isTextPicture) { bitmap.clear(); } } })();
Спойлер MZ, версия 2.0:
Код:/*: *----------------------------------------------------------------------------- * DKR PictureOnSkillObserve *----------------------------------------------------------------------------- * For: RPGMAKER MZ * DKR_PictureOnSkillObserve_2.0_MZ.js *----------------------------------------------------------------------------- * 26.05.2021 - Версия 2.0.0 *----------------------------------------------------------------------------- * Поставляется AS-IS. * Вся ответственность при использовании - на Пользователе! *----------------------------------------------------------------------------- *----------------------------------------------------------------------------- * @author DarchanKaen * @target MZ * @plugindesc (v.2.0.0) Плагин позволяет отображать Картинку / Описание при выборе скила в бою, для каждого скила - свою. * @help * DKR PictureOnSkillObserve 2.0 MZ * ---------------------------------------------------------------------------- * ---Общая информация: * Плагин позволяет отображать Картинку или Описание * (автоматическое или ручное) при выборе скила в бою, * для каждого скила - свою Картинку / Описание. * Картина / Описание отображается в фоне Окна умений. * Для режима Картинок, они должны быть в папке "\img\pictures". * Для режимов Описания, в папке "\img\pictures" должен быть (!!!) * файл "onSkillObserveBackground.png" - это фон описания * (размер изображения 816x624). * ---Использование: * В Примечании к Скилу напишите: *<ImageOnChooseSkill> * Название файла картинки БЕЗ РАСШИРЕНИЯ И КАВЫЧЕК! (например: Actor1 ) *</ImageOnChooseSkill> * И / ИЛИ * <DescrOnChooseSkill> * Текст описания. Допустимы коды сообщений, например цвета типа \C[n]... * </DescrOnChooseSkill> * Если у скила в Примечании нет данных тегов, то ничего доп-го не отображается. * ---Команды (для раздела "Скрипт"): * - Включение и отключение показа Картинки / Описания: * DKR.PictureOnSkillObserve.enablePicture(); - показывать Картинку / Описание. * DKR.PictureOnSkillObserve.dissablePicture(); - не показывать Картинку / Описание. * DKR.PictureOnSkillObserve.dissablePicture(); - не показывать Картинку / Описание. * DKR.PictureOnSkillObserve.setObserverPictureMode('MODE'); - задать режим отображения Картинки / Описания. * где 'MODE' - режим, варианты: * 'IMAGE' (Картинка), * 'DATA' (Полное описание), * 'SIMPLE' (Упрощеное описание), * 'DESCR' (Текст между тегов DescrOnChooseSkill). * режим указывается в ковычках, режим может быть выбрано ТОЛЬКО один; по-умолчанию: 'DATA'. - Настройки отображения Картинки (не влияет на режимы Описания!): * DKR.PictureOnSkillObserve.setPictureNumber(N); - задать номер Картинки; по-умолчанию: 90. Номер должен меньше 95! * DKR.PictureOnSkillObserve.setPictureOrigin(N); - задать начало координат Картинки; по-умолчанию: 0. * DKR.PictureOnSkillObserve.setPictureCoordX(N); - задать координату X Картинки; по-умолчанию: 20. * DKR.PictureOnSkillObserve.setPictureCoordY(N); - задать координату Y Картинки; по-умолчанию: 300. * DKR.PictureOnSkillObserve.setPictureScaleX(N); - задать масштаб X Картинки; по-умолчанию: 100. * DKR.PictureOnSkillObserve.setPictureScaleY(N); - задать масштаб Y Картинки; по-умолчанию: 100. * DKR.PictureOnSkillObserve.setPictureOpacity(N); - задать прозрачность Картинки; по-умолчанию: 255. * DKR.PictureOnSkillObserve.setPictureBlendMode(N); - задать режим смешивания Картинки; по-умолчанию: 0. * где N - значание в виде целого не отрицательного числа. * ---------------------------------------------------------------------------- */ var Imported = Imported || {}; Imported.DKR_PictureOnSkillObserve = true; var DKR = DKR || {}; DKR.PictureOnSkillObserve = DKR.PictureOnSkillObserve || {}; DKR.PictureOnSkillObserve.version = 2.0; ( () => { let picIsShow = true; let textIsShow = true; let picNumber = 90; let picOrigin = 0; let picCoordX = 20; let picCoordY = 300; let picScaleX = 100; let picScaleY = 100; let picOpacity = 255; let picBlendMode = 0; let observerPictureMode = 'DATA'; //IMAGE, DATA, SIMPLE, DESCR const skillDescrBackgroundImageSRC = 'onSkillObserveBackground'; const skillDescrBackgroundOrigin = 0; const skillDescrBackgroundCoordX = 0; const skillDescrBackgroundCoordY = 0; const skillDescrBackgroundScaleX = 100; const skillDescrBackgroundScaleY = 100; const skillDescrBackgroundOpacity = 255; const skillDescrBackgroundBlendMode = 0; let textPictureText = ''; const skillDescrTextOrigin = 0; const skillDescrTextCoordX = 25; const skillDescrTextCoordY = 75; const skillDescrTextScaleX = 100; const skillDescrTextScaleY = 100; const skillDescrTextOpacity = 255; const skillDescrTextBlendMode = 0; const normalColorTag = '\\C[0]'; const nameColorTag = '\\C[4]'; const mpCostColorTag = '\\C[1]'; const tpCostColorTag = '\\C[3]'; const tpGenColorTag = '\\C[11]'; const formulaColorTag = '\\C[8]'; const elementColorTag = '\\C[7]'; const simpleDescrColorTag = '\\C[6]'; const isCanCritColorTag = '\\C[10]'; const varianceColorTag = '\\C[14]'; const repeatsColorTag = '\\C[20]'; const statesColorTag = '\\C[27]'; const targetColorTag = '\\C[18]'; const damageTypeColorTag = '\\C[5]'; DKR.PictureOnSkillObserve.Window_SkillList__UpdateHelp = Window_SkillList.prototype.updateHelp; Window_SkillList.prototype.updateHelp = function(){ DKR.PictureOnSkillObserve.Window_SkillList__UpdateHelp.call(this); if(undefined === this.item()){ console.log('DKR.PictureOnSkillObserve: skill undefined...'); return; } getSkillTextBySkilLData( getSkillDataToDraw(this.item()) ); if(true === picIsShow){ try{ if('IMAGE' === observerPictureMode){ let imageSRC = parseNotesForImageSRC(this.item()); $gameScreen.showPicture(picNumber, imageSRC, picOrigin, picCoordX, picCoordY, picScaleX, picScaleY, picOpacity, picBlendMode); }else{ textIsShow = true; $gameScreen.showPicture(picNumber, skillDescrBackgroundImageSRC, skillDescrBackgroundOrigin, skillDescrBackgroundCoordX, skillDescrBackgroundCoordY, skillDescrBackgroundScaleX, skillDescrBackgroundScaleY, skillDescrBackgroundOpacity, skillDescrBackgroundBlendMode); if('DATA' === observerPictureMode){ textPictureText = getSkillTextBySkilLData( getSkillDataToDraw(this.item()), true ); }else if('SIMPLE' === observerPictureMode){ textPictureText = getSkillTextBySkilLData( getSkillDataToDraw(this.item()), false ); }else if('DESCR' === observerPictureMode){ textPictureText = parseNotesForDescription(this.item()); } $gameScreen.showPicture(picNumber + 1, "", picOrigin, skillDescrTextCoordX, skillDescrTextCoordY, skillDescrTextScaleX, skillDescrTextScaleY, skillDescrTextOpacity, skillDescrTextBlendMode); } }catch (e) { console.log('DKR.PictureOnSkillObserve: skill not exist or wrong notetag!'); return; } } } DKR.PictureOnSkillObserve.Scene_Battle__onSkillCancel = Scene_Battle.prototype.onSkillCancel; Scene_Battle.prototype.onSkillCancel = function() { DKR.PictureOnSkillObserve.Scene_Battle__onSkillCancel.call(this); if(true === picIsShow){ $gameScreen.erasePicture(picNumber); if(true === textIsShow){ $gameScreen.erasePicture(picNumber + 1); } } } DKR.PictureOnSkillObserve.Scene_Battle__onSkillOk = Scene_Battle.prototype.onSkillOk; Scene_Battle.prototype.onSkillOk = function() { DKR.PictureOnSkillObserve.Scene_Battle__onSkillOk.call(this); if(true === picIsShow){ $gameScreen.erasePicture(picNumber); if(true === textIsShow){ $gameScreen.erasePicture(picNumber + 1); } } }; let parseNotesForImageSRC = function(skill){ let notedata = skill.note.split(/[\r\n]+/); let imageSRC = ''; let tag = 'ImageOnChooseSkill'; for (let i = 0; i < notedata.length; i++) { let line = notedata[i]; if (notedata[i].match(tag)) { imageSRC = notedata[i + 1]; break; } } return imageSRC; } let parseNotesForDescription = function(skill){ let notedata = skill.note.split(/[\r\n]+/); let descrText = ''; let tag = 'DescrOnChooseSkill'; let matchCount = 0; for (let i = 0; i < notedata.length; i++) { let line = notedata[i]; if (notedata[i].match(tag)) { matchCount++; if(2 === matchCount){ break; }else{ descrText = '\r\n'; continue; } } if(1 === matchCount){ descrText += notedata[i] + '\r\n' } } return descrText; } let getSkillDataToDraw = function(skill){ let skillName = skill.name; let skillMpCost = skill.mpCost; let skillTpCost = skill.tpCost; let skillTpGain = skill.tpGain; let skillDescr = skill.description; let skillFormula = skill.damage.formula; let skillElement = 'Нет элемента'; if(0 === skill.damage.elementId){ skillElement = 'Обычная атака'; }else if(skill.damage.elementId >-1){ skillElement = $dataSystem.elements[skill.damage.elementId]; } let isSkillCanCrit = ''; if(true === skill.damage.critical){ isSkillCanCrit = 'Да'; }else{ isSkillCanCrit = 'Нет'; } let isSkillCanVariance = skill.damage.variance; let skillRepeats = skill.repeats; let skillAddStates = []; for(let n = 0; n < skill.effects.length; n++){ if(null === skill.effects[n]){ continue; } if(0 === skill.effects[n].dataId){ continue; } let statusId = skill.effects[n].dataId; skillAddStates[n] = [$dataStates[statusId].name, skill.effects[n].value1 * 100]; } if(0 === skillAddStates.length){ skillAddStates = [['Не накладывает статус!', 0]]; } let skillTarget = ''; switch(skill.scope){ case 0: skillTarget = 'Нет цели'; break; case 1: skillTarget = '1 Враг'; break; case 2: skillTarget = 'Все Враги'; break; case 3: skillTarget = '1 случайный Враг'; break; case 4: skillTarget = '2 случайных Врага'; break; case 5: skillTarget = '3 случайных Врага'; break; case 6: skillTarget = '4 случайных Врага'; break; case 7: skillTarget = '1 Союзник'; break; case 8: skillTarget = 'Все Союзники'; break; case 9: skillTarget = '1 мертвый Союзник'; break; case 10: skillTarget = 'Все мертвые Союзники'; break; case 11: skillTarget = 'Сам кастер'; break; default: skillTarget = '???'; break; } let skillDamageType = ''; switch(skill.damage.type){ case 0: skillDamageType = 'Нет типа'; break; case 1: skillDamageType = 'Урон ХП'; break; case 2: skillDamageType = 'Урон МП'; break; case 3: skillDamageType = 'Восст-е ХП'; break; case 4: skillDamageType = 'Восстн-е МП'; break; case 5: skillDamageType = 'Вамп-м ХП'; break; case 6: skillDamageType = 'Вамп-м МП'; break; } let skillDataToDisplay = [skillName, skillMpCost, skillTpCost, skillTpGain, skillDescr, skillFormula, skillElement, isSkillCanCrit, isSkillCanVariance, skillRepeats, skillAddStates, skillTarget, skillDamageType]; return skillDataToDisplay; } let getSkillTextBySkilLData = function(skillData, isFullText){ let skillText = ''; if(true === isFullText){ skillText = ` ${targetColorTag}Цель:${normalColorTag} ${skillData[11]} | ${damageTypeColorTag}Тип:${normalColorTag} ${skillData[12]} ${mpCostColorTag}Стоимость МП:${normalColorTag} ${skillData[1]} | ${tpCostColorTag}Стоимость ТП:${normalColorTag} ${skillData[2]} | ${tpGenColorTag}Генерация ТП:${normalColorTag} ${skillData[3]} ${formulaColorTag}Формула:${normalColorTag} ${skillData[5]} | ${elementColorTag}Элемент:${normalColorTag} ${skillData[6]} ${isCanCritColorTag}Может критовать:${normalColorTag} ${skillData[7]} | ${varianceColorTag}Разброс урона:${normalColorTag} ${skillData[8]}% | ${repeatsColorTag}Повторения:${normalColorTag} ${skillData[9]} ${statesColorTag}Накладывает состояния:${normalColorTag} `; for(let n = 0; n < skillData[10].length; n++){ let currentStatus = skillData[10][n]; if(undefined === currentStatus){ continue; } skillText += currentStatus[0] + '(' + currentStatus[1] + '%)'+ '\r\n'; } }else{ skillText = ` ${nameColorTag}Название:${normalColorTag} ${skillData[0]} | ${targetColorTag}Цель:${normalColorTag} ${skillData[11]} ${mpCostColorTag}Стоимость МП:${normalColorTag} ${skillData[1]} | ${tpCostColorTag}Стоимость ТП:${normalColorTag} ${skillData[2]} | ${tpGenColorTag}Генерация ТП:${normalColorTag} ${skillData[3]} ${simpleDescrColorTag}Описание:${normalColorTag} ${skillData[4]}` } return skillText; } DKR.PictureOnSkillObserve.enablePicture = function(){ picIsShow = true; } DKR.PictureOnSkillObserve.dissablePicture = function(){ picIsShow = false; } DKR.PictureOnSkillObserve.setObserverPictureMode = function(MODE){ observerPictureMode = MODE; } DKR.PictureOnSkillObserve.setPictureNumber = function(pNumber){ if(pNumber < 0){ console.log('DKR.PictureOnSkillObserve: picture number can`t be below zero!'); return; }else if(pNumber > 95){ console.log('DKR.PictureOnSkillObserve: picture number can`t be more then 90!'); return; } picNumber = pNumber; } DKR.PictureOnSkillObserve.setPictureOrigin = function(pOrigin){ picOrigin = pOrigin; } DKR.PictureOnSkillObserve.setPictureCoordX = function(pCoordX){ if(pCoordX < 0){ console.log('DKR.PictureOnSkillObserve: picture coordinate X can`t be below zero!'); return; } picCoordX = pCoordX; } DKR.PictureOnSkillObserve.setPictureCoordY = function(pCoordY){ if(pCoordY < 0){ console.log('DKR.PictureOnSkillObserve: picture coordinate Y can`t be below zero!'); return; } picCoordY = pCoordY; } DKR.PictureOnSkillObserve.setPictureScaleX = function(pScaleX){ if(pScaleX < 0){ console.log('DKR.PictureOnSkillObserve: picture scale X can`t be below zero!'); return; } picScaleX = pScaleX; } DKR.PictureOnSkillObserve.setPictureScaleY = function(pScaleY){ if(pScaleY < 0){ console.log('DKR.PictureOnSkillObserve: picture scale Y can`t be below zero!'); return; } picScaleX = pScaleX; } DKR.PictureOnSkillObserve.setPictureOpacity = function(pOpacity){ picOpacity = pOpacity; } DKR.PictureOnSkillObserve.setPictureBlendMode = function(pBlendMode ){ picBlendMode = pBlendMode ; } //Thanks to Yoji Ojima const _Game_Picture_show = Game_Picture.prototype.show; Game_Picture.prototype.show = function() { _Game_Picture_show.apply(this, arguments); if (this._name === "" && textPictureText) { this.mzkp_text = textPictureText; this.mzkp_textChanged = true; textPictureText = ''; } }; const _Sprite_Picture_destroy = Sprite_Picture.prototype.destroy; Sprite_Picture.prototype.destroy = function() { destroyTextPictureBitmap(this.bitmap); _Sprite_Picture_destroy.apply(this, arguments); }; const _Sprite_Picture_updateBitmap = Sprite_Picture.prototype.updateBitmap; Sprite_Picture.prototype.updateBitmap = function() { _Sprite_Picture_updateBitmap.apply(this, arguments); if (this.visible && this._pictureName === "") { const picture = this.picture(); const text = picture ? picture.mzkp_text || "" : ""; const textChanged = picture && picture.mzkp_textChanged; if (this.mzkp_text !== text || textChanged) { this.mzkp_text = text; destroyTextPictureBitmap(this.bitmap); this.bitmap = createTextPictureBitmap(text); picture.mzkp_textChanged = false; } } else { this.mzkp_text = ""; } }; function createTextPictureBitmap(text) { const tempWindow = new Window_Base(new Rectangle()); const size = tempWindow.textSizeEx(text); tempWindow.padding = 0; tempWindow.move(0, 0, size.width, size.height); tempWindow.createContents(); tempWindow.drawTextEx(text, 0, 0, 0); const bitmap = tempWindow.contents; tempWindow.contents = null; tempWindow.destroy(); bitmap.mzkp_isTextPicture = true; return bitmap; } function destroyTextPictureBitmap(bitmap) { if (bitmap && bitmap.mzkp_isTextPicture) { bitmap.destroy(); } } })();
Спойлер Версия 1.0, устаревшая:
Код:/*: *----------------------------------------------------------------------------- * DKR PictureOnSkillObserve *----------------------------------------------------------------------------- * For: RPGMAKER MV / MZ * DKR_PictureOnSkillObserve_MV_MZ.js *----------------------------------------------------------------------------- * 24.05.2021 - Версия 1.0.0 *----------------------------------------------------------------------------- * Поставляется AS-IS. * Вся ответственность при использовании - на Пользователе! *----------------------------------------------------------------------------- *----------------------------------------------------------------------------- * @author DarchanKaen * @plugindesc (v.1.0.0) Плагин позволяет отображать Картинку при выборе скила в бою, для каждого скила - свою. * @help * DKR PictureOnSkillObserve * ---------------------------------------------------------------------------- * ---Общая информация: * Плагин позволяет отображать Картинку * при выборе скила в бою, * для каждого скила - свою. * Картина отображается в фоне Окна умений. * В Примечании к Скилу напишите: *<ImageOnChooseSkill> *Название файла картинки БЕЗ РАСШИРЕНИЯ И КАВЫЧЕК! (например: Actor1 ) *</ImageOnChooseSkill> * - Включение и отключение показа Картинки: * DKR.PictureOnSkillObserve.enablePicture(); - показывать Картинку. * DKR.PictureOnSkillObserve.dissablePicture(); - не показывать Картинку. - Настройки отображения Картинки: * DKR.PictureOnSkillObserve.setPictureNumber(); - задать номер Картинки; по-умолчанию: 1. * DKR.PictureOnSkillObserve.setPictureOrigin(); - задать начало координат Картинки; по-умолчанию: 0. * DKR.PictureOnSkillObserve.setPictureCoordX(); - задать координату X Картинки; по-умолчанию: 20. * DKR.PictureOnSkillObserve.setPictureCoordY(); - задать координату Y Картинки; по-умолчанию: 300. * DKR.PictureOnSkillObserve.setPictureScaleX(); - задать масштаб X Картинки; по-умолчанию: 100. * DKR.PictureOnSkillObserve.setPictureScaleY(); - задать масштаб Y Картинки; по-умолчанию: 100. * DKR.PictureOnSkillObserve.setPictureOpacity(); - задать прозрачность Картинки; по-умолчанию: 255. * DKR.PictureOnSkillObserve.setPictureBlendMode (); - задать режим смешивания Картинки; по-умолчанию: 0. * ---------------------------------------------------------------------------- */ var Imported = Imported || {}; Imported.DKR_PictureOnSkillObserve = true; var DKR = DKR || {}; DKR.PictureOnSkillObserve = DKR.PictureOnSkillObserve || {}; ( () => { DKR.PictureOnSkillObserve.picIsShow = true; DKR.PictureOnSkillObserve.picNumber = 1; DKR.PictureOnSkillObserve.picOrigin = 0; DKR.PictureOnSkillObserve.picCoordX = 20; DKR.PictureOnSkillObserve.picCoordY = 300; DKR.PictureOnSkillObserve.picScaleX = 100; DKR.PictureOnSkillObserve.picScaleY = 100; DKR.PictureOnSkillObserve.picOpacity = 255; DKR.PictureOnSkillObserve.picBlendMode = 0; Window_SkillList.prototype.updateHelp = function() { this.setHelpWindowItem(this.item()); if(true === DKR.PictureOnSkillObserve.picIsShow){ try{ let imageSRC = parseNotesForImageSRC(this.item()); $gameScreen.showPicture(DKR.PictureOnSkillObserve.picNumber, imageSRC, DKR.PictureOnSkillObserve.picOrigin, DKR.PictureOnSkillObserve.picCoordX, DKR.PictureOnSkillObserve.picCoordY, DKR.PictureOnSkillObserve.picScaleX, DKR.PictureOnSkillObserve.picScaleY, DKR.PictureOnSkillObserve.picOpacity, DKR.PictureOnSkillObserve.picBlendMode); }catch (e) { console.log('DKR.PictureOnSkillObserve: skill not exist or wrong notetag!'); return; } } }; Scene_Battle.prototype.onSkillCancel = function() { this._skillWindow.hide(); this._actorCommandWindow.activate(); if(true === DKR.PictureOnSkillObserve.picIsShow){ $gameScreen.erasePicture(DKR.PictureOnSkillObserve.picNumber); } }; Game_Action.prototype.apply = function(target) { if(true === DKR.PictureOnSkillObserve.picIsShow){ $gameScreen.erasePicture(DKR.PictureOnSkillObserve.picNumber); } var result = target.result(); this.subject().clearResult(); result.clear(); result.used = this.testApply(target); result.missed = (result.used && Math.random() >= this.itemHit(target)); result.evaded = (!result.missed && Math.random() < this.itemEva(target)); result.physical = this.isPhysical(); result.drain = this.isDrain(); if (result.isHit()) { if (this.item().damage.type > 0) { result.critical = (Math.random() < this.itemCri(target)); var value = this.makeDamageValue(target, result.critical); this.executeDamage(target, value); } this.item().effects.forEach(function(effect) { this.applyItemEffect(target, effect); }, this); this.applyItemUserEffect(target); } }; let parseNotesForImageSRC = function(skill){ let notedata = skill.note.split(/[\r\n]+/); let imageSRC = ''; let tag = 'ImageOnChooseSkill'; for (let i = 0; i < notedata.length; i++) { let line = notedata[i]; if (notedata[i].match(tag)) { imageSRC = notedata[i + 1]; break; } } return imageSRC; } DKR.PictureOnSkillObserve.enablePicture = function(){ DKR.PictureOnSkillObserve.picIsShow = true; } DKR.PictureOnSkillObserve.dissablePicture = function(){ DKR.PictureOnSkillObserve.picIsShow = false; } DKR.PictureOnSkillObserve.setPictureNumber = function(pNumber){ if(pNumber < 0){ console.log('DKR.PictureOnSkillObserve: picture number can`t be below zero!'); return; } DKR.PictureOnSkillObserve.picNumber = pNumber; } DKR.PictureOnSkillObserve.setPictureOrigin = function(pOrigin){ DKR.PictureOnSkillObserve.picOrigin = pOrigin; } DKR.PictureOnSkillObserve.setPictureCoordX = function(pCoordX){ if(pCoordX < 0){ console.log('DKR.PictureOnSkillObserve: picture coordinate X can`t be below zero!'); return; } DKR.PictureOnSkillObserve.picCoordX = pCoordX; } DKR.PictureOnSkillObserve.setPictureCoordY = function(pCoordY){ if(pCoordY < 0){ console.log('DKR.PictureOnSkillObserve: picture coordinate Y can`t be below zero!'); return; } DKR.PictureOnSkillObserve.picCoordY = pCoordY; } DKR.PictureOnSkillObserve.setPictureScaleX = function(pScaleX){ if(pScaleX < 0){ console.log('DKR.PictureOnSkillObserve: picture scale X can`t be below zero!'); return; } DKR.PictureOnSkillObserve.picScaleX = pScaleX; } DKR.PictureOnSkillObserve.setPictureScaleY = function(pScaleY){ if(pScaleY < 0){ console.log('DKR.PictureOnSkillObserve: picture scale Y can`t be below zero!'); return; } DKR.PictureOnSkillObserve.picScaleX = pScaleX; } DKR.PictureOnSkillObserve.setPictureOpacity = function(pOpacity){ DKR.PictureOnSkillObserve.picOpacity = pOpacity; } DKR.PictureOnSkillObserve.setPictureBlendMode = function(pBlendMode ){ DKR.PictureOnSkillObserve.picBlendMode = pBlendMode ; } })();
Спойлер Как это выглядит в игре:
Спойлер Изменения в Версии 2.0:1. Увеличена совместимость с другими плагинами.
2. Оптимизировано удаление Картинки / Описания - теперь оно удаляется сразу после выбора скила (до выбора Цели).
3. Добавлен новый функционал - отображение Описания скила.
Спойлер Ссылки на загрузку, версия 2.0:
Обратите внимание!
Для корректно работы плагина в папке "\img\pictures" должен быть (!!!) файл "onSkillObserveBackground.png" - это фон Описания (размер изображения 816x624).
Спойлер Файл фона, ПКМ и сохраните как Изображение:
Условия поставки плагина:
Поставляется AS-IS.
Вся ответственность при использовании - на Пользователе!
!
Совместимость с другими плагинами Автор не гарантирует!
Спойлер Лирическое отступление:Более продвинутая версия плагина для Seibur.
Мне тяжело представить, зачем такое нужно...Но опыт интересный.
2.0
Да, описание скила может быть полезной штукой.
На MV, правда, не очень красиво вышло.

Хорошо!:
Плохо!:

Ответить с цитированием








![[MV -+ MZ]PictureOnSkillObserve](https://rpgmaker.su/images/rpgmakerunion.png)
Социальные закладки